from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from functools import wraps
from django.db import transaction


class LoginRequiredMixin(object):
    """重写as_view()  验证用户是否登陆"""
    @classmethod
    def as_view(cls, **initkwargs):
        """使用login_required装饰区，装饰View的as_view()执行之后的结果"""
        view = super().as_view(**initkwargs)
        return login_required(view)




# 响应json，且验证用户是否登录，
def login_required_json(view_func):
    """验证用户是否登录，并响应json"""

    #装饰器会修改方法的__name__,有可能修改类视图中定义的请求方法的名字，造成请求的分发失败
    #wraps装饰器会保证被装饰的函数的__name__不会被改变，而且会保留原有的说明文档信息
    @wraps(view_func)
    def wrapper(request,*args,**kwargs):#wrapper打包意思
        """判断用户是否登录，如果未登录响应json，如果登录进入到视图"""
        if not request .user.is_authenticated():
            return JsonResponse({'code':1,'message':'用户未登录'})
        else:
            return view_func(request,*args,**kwargs)#进入视图，就是调用视图，保证视图内部代码可以被执行

    return wrapper


class LoginRequiredJSONJMixin(object):
    """重写as_view()  验证用户是否登陆"""

    @classmethod
    def as_view(cls, **initkwargs):
        """使用login_required装饰区，装饰View的as_view()执行之后的结果"""
        view = super().as_view(**initkwargs)

        return login_required_json(view)


class TransactionAtomicMixin(object):
    """重写as_view()  事务装饰器"""

    @classmethod
    def as_view(cls, **initkwargs):
        """使用login_required装饰区，装饰View的as_view()执行之后的结果"""
        view = super().as_view(**initkwargs)

        return transaction.atomic(view)



